HTTP 이론
NOTE
인터넷 네트워크(IP/TCP/UDP/DNS)부터 URI, HTTP 메시지 구조·메서드·상태코드·헤더, 쿠키·캐시·조건부 요청까지 김영한 HTTP 강의를 한 문서로 정리한다.
📌 개념
인터넷 네트워크 정리
-
IP
- IP 프로토콜의 한계
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송 (* 비연결성)
- 중간에 패킷이 사라지거나, 패킷이 순서대로 안온다면 (* 비신뢰성)
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면? (* 프로그램 구분)
- IP 프로토콜의 한계
-
TCP & UDP
-
프로토콜 계층
- 애플리케이션 계층 ( socket 라이브러리)
- TCP / UDP / IP ( OS )
- LAN 드라이버 / 장비 ( 네트워크 인터페이스 (랜카드) )
-
TCP
- 3-way-hsndshake
- client → server ( SYN )
- server → client ( SYN + ACK )
- client → server ( ACK )
- 3-way-handshake 이후 데이터 전송
- 데이터 전송 (client → server)
- 데이터 잘받았다는 응답 (server → client)
NOTE
3-way-handshake
- 신뢰성 있는 전달 가능
- 순서 보장
- 3-way-hsndshake
-
UDP
- IP 와 거의 같지만 PORT 가 추가된 상태
- 데이터 전송이 빠르지만, 신뢰성이 없다
NOTE
PORT 란?
- 동일 IP로 온 패킷들을 구분하고자 port를 설정 (필요한 애플리케이션별로 port 지정)
- ex) 뮤직 스트리밍 (동일 IP:7070) / 게임 (동일 IP:2020)
-
-
PORT
- 같은 IP 내에서 프로세스를 구분하기 위해 PORT 사용
-
DNS
- DNS가 있는 이유
- IP가 변경될 수 있다
- IP를 기억하고 있기가 힘들다
- DNS가 있는 이유
웹 브라우저 흐름과 URI
- URL / URI / URN
- URL
- Resource Locator
- 리소스가 있는 위치를 지정
- ex ) http://www.example.com/test/main
- URN
- Resource Name
- 리소스 이름을 부여 ( 이름 그 자체로 사용 )
- 보편화 되지 않은 방법
- ex) example:test:main
- URI
- Uniform : 자원 식별하는 통일된 방식
- Resource : 자원
- Identifier : 식별
- URI 와 URL은 비슷한 의미로 사용됨
- URL 스키마
- scheme://[userinfo@]host[:port][/path][?query][#fragment]
- scheme : ftp / http / https / … (프로토콜 들)
- query : 쿼리를 날려서 원하는 데이터를 줌 ( 무조건 String으로 값이 넘어감 )
- fragment : 웹 html에서 붙여주는 메타데이터 같은 값이지만 서버로 넘어가지는 않는다
- URL
- 웹 브라우저 흐름
- CLIENT
- 요청
- [메서드 : GET / POST / DELETE ..][path][query]HTTP버전정보[host: www.example.com]
- HTTP → TCP → IP → 네트워크 망 → SERVER
- 요청
- SERVER
- 응답
- [HTTP/1.1 버전] [응답 상태코드][ OK / FAIL]
- Content TYPE = text/html
- charset=UTF-8
- Content Length = 데이터 내용 길이
- [응답 데이터]
- HTTP → TCP → IP → 네트워크 망 → CLIENT
- 응답
- CLIENT
HTTP
-
HTTP 역할
- 전송 역할
- HTML, TEXT , JSON, XML, IMAGE, 음성, 영상, 파일 등등
- 특수한 상황 (게임서버) 가 아닌 경우 TCP 전송이 아닌 HTTP 전송을 사용한다
- HTTP 버전
- HTTP/1.1 이 대부분 사용됨
- HTTP/2.0 : 성능 개선
- HTTP/3.0 : UDP 위주 사용 (성능 개선)
- 전송 역할
-
클라이언트 - 서버 구조
- CLIENT → SERVER (Request)
- SERVER → CLIENT (Response)
- 요청 ↔ 응답 구조
-
Stateless (무상태 프로토콜 지향)
- Stateless
- 서버가 클라이언트의 상태를 보존하지 않는다
- Stateful (상태 유지) VS Stateless (무상태) 차이
- Stateful
- Client의 상태를 유지
- 장점) Client 상태를 유지하고 있어서, 기존의 정보를 가지고 유추가 가능하다. (데이터의 요청 정보 크기가 작다)
- 단점) 다른 서버로 바뀔경우, 정보가 없어서 에러가 발생한다.
- Stateless
- Client 상태 유지x
- 장점) 중간에 다른 서버로 바뀌어도, 정보 유지를 하지 않기에 문제가 되지 않는다 (서버 증설 가능)
- 단점1) 모든 것을 무상태로 설계할 수 있는 것이 아니다.
- 단점2) 데이터 요청 정보 크기가 크다
- Stateful
- 상태유지가 가능한 로직 vs 무상태가 가능한 로직
- 상태 유지 로직
- 로그인
- 무상태 로직
- 로그인이 필요 없는 단순한 서비스 소개 화면
- 상태 유지 로직
- Stateless
-
비연결성
- 연결을 유지하는 모델
- TCP/IP 연결
- 단점) 유지해야하는 자원이 크다
- 연결을 유지하지 않는 모델
- HTTP
- 장점) 최소한의 자원을 가지고 있을 수 있다
- 단점) TCP/IP 핸드쉐이크를 또 해야함 , 계속해서 요청을 할떄마다 여러 데이터를 받아야함
- → 보완) HTTP 지속 연결 (TCP/IP를 연결 유지를 하고, 어느정도 요청에 따른 데이터가 종료되면 연결을 종료함)
- 연결을 유지하는 모델
-
HTTP 메시지
- HTTP 메시지 구조
- Start-line 시작 라인
- 요청 ) [HTTP 메서드 → GET/ POST ..] [PATH : 절대경로] [쿼리문] [HTTP] 버전
- 응답 ) HTTP 버전 [응답 상태]
- Header
- 헤더 규칙 → field-name:[공백][정보];
- 요청) HOST: [정보]
- 응답) [Content-Type]: [응답 구조], charset, content-length
- 공백라인 (CRLF)
- 요청/응답 공통
- messsage body
- 요청/응답 공통
- message( 바이트로 표현할 수 있는 모든 데이터) 내용 (없으면 공백)
- Start-line 시작 라인
- HTTP 메서드
- GET : 리소스 조회
- POST : 요청 내역 처리
- PUT
- DELETE
- 응답 상태 코드
- 200 : 성공
- 400 : 클라이언트 요청 오류
- 500 : 서버 오류
- HTTP 메시지 구조
-
HTTP 메서드
- URI 설계 (API 설계)
- 가장 중요한 것은 “리소스” (URI는 리소스만 식별!)
- 리소스와 행위를 분리
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경 (→ 메서드를 이용해서 표현)
- HTTP 메서드
- 주요 메서드
- GET : 리소스 조회
- POST : 요청 데이터 처리 ( 주로 등록에 사용)
- PUT : 리소스를 대체 (해당 리소스가 없으면 생성)
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
- GET
- 리소스 조회
- 서버에 전달하고 싶은 요청 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음
- POST
- 요청 데이터 처리 (서버에게 데이터 처리를 요청)
- 메시지 바디를 통해서 서버로 요청 데이터를 전달
- 무언가를 등록할 때 많이 사용 (→ 정확한 리소스 위치를 알 수 없다 (서버가 지정해줌))
- 응답 데이터
- 새로운 URI 위치를 반환
- 메시지 받은 내용 반환
- 컨트롤 URI
- 리소스 만으로 설계가 불가능할떄에, 행위를 URI 로 만드는 것을 “컨트롤URI” 라고 한다
- ex) POST /orders/{orederId}/start-delevery
- 대부분의 경우 가능하다 → GET의 역할도 가능
- 다만, 조회의 영역에서는 GET을 사용하는 것이 캐싱하는데에 유리하다
- PUT
- 리소스를 대체
- 리소스가 없으면 새로 생성
- 리소스가 있으면 완전 대체
- POST와 차이점
- 리소스 위치를 정확하게 알고 있음 ( ex) /members/100 )
- PUT의 주의점
- 리소스를 완전 대체하기에 변경하지 않는 정보도 다시 보내줘야한다. (아니면 없애버림)
- 리소스를 대체
- PATCH
- 리소스 부분 변경
- PUT의 개선
- 리소스 완전대체가 아니기에, 부분적으로 원하는 값을 변경할 수 있다
- POST와 차이점도 PUT과 동일하다
- DELETE
- 리소스 삭제
- 주요 메서드
- URI 설계 (API 설계)
-
HTTP 메서드 속성
- 안전
- 호출해도 리소스를 변경하지 않는다
- GET → 안전 (POST, PUT , PATCH, DELETE → 안전하지 않음)
- 멱등
- 한번이든 두번이든 백번이든 결과가 똑같다 (외부 요인 고려 x → 다른 사용자가 수정한 것을 조회한 것 (이럴 경우 고려하지 않음)
- GET, PUT , DELETE → 최종결과가 동일하기에 멱등하다
- POST → 두 번 호출하면 같은 결제가 중복해서 발생할 수 있어서 멱등하지 않다
- 멱등할 경우 괜찮은 경우
- 자동 복구 메커니즘
- 서버에서 응답 없을시 다시 호출 가능
- 캐시 가능
- GET, HEAD, POST, PATCH 캐시 가능
- 다만, GET / HEAD의 경우만 주로 사용
- POST / PATCH 는 구현이 어려워서 사용하지 않음 (본문까지 캐시 키로 고려하는게 쉽지 않음)
- GET, HEAD, POST, PATCH 캐시 가능
- 안전
-
HTTP 메서드 활용
- 클라이언트 → 서버 데이터 전송
- 쿼리 파라미터를 통한 데이터 전송
- GET
- ex) 주로 정렬 필터 ( 검색어 )
- 메시지 마디를 통한 데이터 전송
- POST , PUT, PATCH
- 리소스를 변경할 때 주로 사용
- 쿼리 파라미터를 통한 데이터 전송
- 정적 데이터 조회
- GET 주로 사용
- 동적 데이터 조회
- 쿼리 파라미터를 이용해서 조회
- 검색, 게시판 목록 정렬 필터 (검색어) 주로 사용
- GET을 이용 (쿼리 파라미터 이용)
- HTML From 데이터 전송
- HTML form타입을 이용하여 POST 본문 메시지를 작성
- Key = Value 형식으로 서버에 전달
- GET 메서드를 사용했을경우, 쿼리 파라미터로 서버에 전송한다 (정보 저장 및 수정인 경우 GET 사용을 지양해야함)
- 파일을 전송시에 사용 enctype
- Content-Type: multipart/form-data
- POST 사용
- HTML Form형식은 GET / POST 만 지원한다
- HTTP API 데이터 전송
- HTTP 를 직접 만들어서 요청
- HTTP API 데이터 전송을 사용하는 곳
- 서버 ↔ 서버
- 앱 클라이언트
- 웹 클라이언트 (AJAX / 자바 스크립트를 통한 통신)
- POST /PUT / PATCH : 메시지 바디를 통해 데이터 전송
- GET : 조회, 쿼리 파라미터로 데이터 전달
- Text, XML, JSON
- Content-Type: application/json
- 클라이언트 → 서버 데이터 전송
-
HTTP API 설계 예시
-
API 설계
- HTTP 포스트 기반 등록 (POST 기반 등록)
-
회원 리소스 식별 (리소스 == 명사)
- 회원 목록 : /members → GET
- 회원 등록 : /members → POST
- 회원 조회 : /member/{id} → GET
- 회원 수정 : /members/{id} → PATCH, PUT , POST
- 회원 삭제 : /members/{id} → DELETE
NOTE
POST 와 PUT/PATCH 간의 차이점
- POST의 경우 회원 등록 URI를 모른다 (서버가 만들어서 응답으로 넘겨줌)
- PUT/PATCH의 경우 회원 등록 URI를 안다 (클라이언트가 위치를 알고 있음)
컬렉션: 서버가 관리하는 URI (서버가 위치를 지정 → POST)
-
파일 관리 시스템 (PUT 기반 등록)
- 파일 목록 : /files → GET
- 파일 조회 : /files/{filename} → GET
- 파일 등록 : /files/{filename} → PUT
- 파일 삭제 : /files/{filename} → DELETE
- 파일 대량 등록 : /files → POST
NOTE
파일 등록에 PUT을 이용
- 클라이언트가 파일 등록 URI를 알고 있다
스토어: 클라이언트가 관리하는 URI (클라이언트가 위치를 지정 → PUT)
-
HTML Form 사용
NOTE
HTML Form 특징
- AJAX / JavaScript를 이용하여 API 구현 가능
- GET / POST 만 지원
- 컨트롤 URI를 사용 (동사로 된 URI)
- ex) /new, /delete, /edit 등등
- 왠만하면 컨트롤 URI는 사용하지 않는 것이 좋다 (어쩔 수 없을 때만 사용)
- 회원 목록 : /members → GET
- 회원 등록 폼 : /members/new → GET
- 회원 등록 : /members/new OR members → POST
- 강사님 개인적으로 회원 등록폼 URI를 똑같이 사용하는 편
- 회원 조회 : /members/{id} → GET
- 회원 수정 폼 : /members/{id}/edit → GET
- 회원 수정 : /members/{id}/edit OR members/{id} → POST
- 강사님 개인적으로 회원 등록폼 URI를 똑같이 사용하는 편
- 회원 삭제 : /members/{id}/delete → POST
-
- HTTP 포스트 기반 등록 (POST 기반 등록)
-
참고하면 좋은 URI 설계 개념
REST API URI Naming Conventions and Best Practices
- 문서
- 단일 개념 (파일,객체, 데이터베이스 row)
- ex) /files/{fileId}
- 컬렉션
- 서버가 URI 지정
- ex) /members
- 스토어
- 클라이언트가 URI 지정
- ex) /members/100
- 컨트롤러 , 컨트롤 URI
- 문서, 컬렉션, 스토어로 해결하기 어려운경우
- 동사를 직접 사용
- ex) /members/{id}/delete
- 문서
-
-
HTTP 상태코드
- 서버에서 보내는 응답에서 오는 코드
- 100번대 : 요청이 수신되어 처리중
- 200번대 : 요청 정상 처리
- 300번대 : 요청을 완료하면 추가 행동 필요
- 400번대 : 클라이언트 오류 (요청 오류)
- 500번대 : 서버 오류 (정상 요청 처리 불가)
- 응답코드 상세설명
- 100 번대
- 잘 사용되지 않음
- 200번대
- 200 : OK
- 201 : Created (리소스 생성)
- HTTP 헤더에 Location 정보도 같이 줌
- POST에서 주로 사용
- 202 : Accepted ( 요청이 접수 되었으나, 아직 처리 완료되지 않음 )
- 204 : No Content ( 응답 결과로 본문에 보낼 데이터가 없음 )
- ex) 웹 문서 편집기에서 save 버튼
- 300번대
- 추가 조치 필요 (Location 정보를 응답결과에 넣음)
- 해당 Location 정보로 리다이렉트 됨
- 리다이렉트
- 응답 결과에 Location이 있다면 해당 위치로 이동
- 리다이렉션 종류
- 영구 리다이렉트 : 특정 리소스의 URI가 영구적으로 이동
- 301번, 308번
- 301번 (주로 많이 사용됨)
- Client(POST) → Server
- Server → Client : 301번 반환
- Client(GET) → Server // 본문 (Body) 사라짐 (다시 작성해야함)
- 308번
- Client(Post) → Server
- Server → Client : 308번 반환
- Client(POST) → Server // 본문 (Body) 유지 (다시 작성안해도 작성된 본문 유지 )
- 301번 (주로 많이 사용됨)
- ex) /members → /users
- 301번, 308번
- 일시 리다이렉션 : 일시적인 변경
- 주문 완료 후 주문 내역화면으로 이동 (→ Post/Redirect/Get 패턴)
- PRG 사용 전
- POST로 주문후 , 새로고침하면 또다시 POST를 보내게됨 (중복 요청)
- PRG사용
- POST (요청) → Server
- Server → Client ( Location 정보 전달)
- 새로고침 + Client(Get) - 해당 Location위치로 GET → Server ( 본문은 날아감 )
- PRG 사용 전
- 302번 (지금도 자주 사용됨)
- GET으로 변하고 , 본문이 제거 될 수 있음
- Client(POST) → Server
- Server → Client : 302번 반환
- Client(GET) → Server // 본문 (Body) 사라짐 (다시 작성해야함)
- 307번 ( HTTP에서 권장)
- 요청 메서드와, 본문이 유지
- Client(POST) → Server
- Server → Client : 307번 반환
- Client(POST) → Server // 본문 (Body) 유지
- 303번 (HTTP 에서 권장)
- 요청 메서드를 무조건 GET으로 변경
- Client(POST) → Server
- Server → Client : 303번 반환
- Client(GET) → Server // 본문 (Body) 사라짐 (다시 작성해야함)
- 주문 완료 후 주문 내역화면으로 이동 (→ Post/Redirect/Get 패턴)
- 특수 리다이렉션
- 결과 대신 캐시를 사용
- 304번 (캐시에서 자주 사용)
- 캐시로 리다이렉트
- 캐시를 사용하므로, 응답에 메시지 바디가 존재하지 않는다
- GET / HEAD 요청시에 사용
- 영구 리다이렉트 : 특정 리소스의 URI가 영구적으로 이동
- 400번대
-
클라이언트 오류
-
400번
- 클라이언트가 잘못 보냄 (BAD REQUEST)
-
401번
- 인증되지 않음 (UnAuthorized) → 로그인이 되지 않은 것을 의미
NOTE
인증 vs 인가
- 인증 (Authentication): 본인 확인 (로그인 여부)
- 인가 (Authorization): 권한 존재 여부
-
404
- 요청 리소스가 서버에 없음
- 클라이언트가 권한이 부족한 리소스에 접근할때
-
- 500번대
- 서버 오류
- 500번
- Internal Server Error
- 애매한 서버 문제
- 503번
- 서버가 일시적으로 요청을 처리할 수 없음 (과부하, 예정된 작업)
- Retry-After : 얼마뒤에 복구되는지도 보낼 수 있음
- 100 번대
- 서버에서 보내는 응답에서 오는 코드
-
HTTP 헤더1 (일반헤더)
- 엔티티
- general 영역
- 공통된 영역
- request 영역
- client 내용
- response 영역
- 서버 내용
- 본문 영역
- 메시지 타입/ 길이 / 본문 내용
- general 영역
- 엔티티 → 표현 (repregentation) // 명칭이 바뀜
- Content-Type : 표현 데이터 형식 ( → html / json …)
- Content Body에 들어가는 타입 유형
- Content-Encoding : 표현 데이터의 압축 방식
- 데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가
- gzip, deflate, identity
- Content-Language : 표현 데이터의 자연 언어
- ko / en / en-US
- Content-Length : 표현 데이터 길이 (본문 내용 길이)
- Transfer-encoding을 사용하면 Content-Length를 사용하면 안됨
- Content-Type : 표현 데이터 형식 ( → html / json …)
- 엔티티
-
협상 (콘텐츠 네고시에이션)
- 협상 헤더는 요청시에만 사용
- 클라이언트가 선호하는 표현 요청
- Accept : 서버에게 원하는 것을 요청
- html / json / xml / image ….
- Accept-Language : 원하는 자연 언어(ko, en …)을 요청
- Quality Value (q) : 협상과 우선순위
- ex) Accept-Lanaguage : KO-KR, ko;q=0.9,en-US;q=0.8,en;q=0.7
- KO-KR > ko > en-US > en : 우선순위
- Accept-Charset
- 선호하는 문자 인코딩
- UTF-8, …
- Accept-Encoding
- 선호하는 압축 인코딩
- gzip, ..
- Accept : 서버에게 원하는 것을 요청
-
전송 방식
- 단순 전송
- Content-Length : 본문 실제 길이를 알 수 있을때 사용
- 압축 전송
- Content-Encoding : 압축 방법
- Content-Length : 압축 실제 길이
- 분할 전송
- Transfer-Encoding : chunked (분할해서 전송)
- 본문 위치
- 분할 크기
- 분할 내용
- … (반복)
- (마지막) /r/n
- 범위 전송
- Content-Range : 1000 ~ 2000
- 범위를 나누어서 전송
- 단순 전송
-
일반 정보
- From
- 유저 에이전트의 이메일 정보
- Referer
- 이전 웹 페이지 주소
- 유입 경로 분석할때 많이 사용
- User-Agent
- 유저 애플리케이션 정보
- ex) Apple , window ..
- Server
- Origin 서버 소프트웨어 정보
- Origin 서버 : 맨마지막 뒷단에 요청을 처리하는 서버
- Date
- 요청 날짜
- 특별한 정보
- Host
- 필수 헤더
- 하나의 서버에 여러 도메인을 가지고 있을 수 있어서, HOST헤더를 넣어서 지정해줘야한다.
- Location
- 페이지 리다이렉션 (페이지 이동 → 응답코드 : 300번대 )
- Allow
- 허용 가능한 HTTP 메서드
- ALLOW : GET, POST …
- Retry-After
- 유저 에이전트가 다음 요청을 하기까지 기다려야하는 시간
- ex) 서버 점검
- Host
- 인증
- Authorization
- 클라이언트 인증 정보를 서버에 전달
- 로그인
- WWW-Authenticate
- 리소스 접근시 필요한 인증 방법 정의
- 401 Unauthorized 응답과함께 사용
- Authorization
- From
-
쿠키
- Set-Cookie : 서버에서 응답시 클라이언트로 헤더로 전달
- Cookie : 클라이언트가 요청을 할때마다, 쿠키 저장소에서 쿠키 값을 꺼내어 서버에 보냄 (헤더로 붙여서)
NOTE
Stateless 상태
- 서버는 이전 상태 기억이 없다
- 요청하고 응답하면 연결을 끊는다
해결 방법
- 모든 정보를 요청할 때마다 서버에 보낸다, 또는
- 쿠키를 사용한다
-
쿠키
- ex) set-cookie : session-id : ~, expired(또는 max-age): ~ , path: ~, domain : ~, secure : ~
- expired : 쿠키 생존범위
- path : 쿠키 접근 권한 경로 설정 (일반적으로 “/” 경로로 설정)
- domain : 쿠키 적용할 도메인
- secure : https 경우에만 적용
- HttpOnly : XSS 공격 방지 (js 접근 불가)
- SameSite : XSRF공격방지 (요청도메인과 쿠키 도메인이 같을 때만 쿠키전송)
- 단점) 쿠키정보는 항상 서버에 전송됨 (네트워크 트래픽이 추가로 유발하므로, 최소한의 정보만 사용
NOTE
웹 스토리지
- 쿠키처럼 서버로 전송하지 않고, 웹 브라우저 내에 데이터를 저장하는 방법 (localStorage/sessionStorage)
- ex) set-cookie : session-id : ~, expired(또는 max-age): ~ , path: ~, domain : ~, secure : ~
- Set-Cookie : 서버에서 응답시 클라이언트로 헤더로 전달
-
캐시와 조건부 요청
-
캐시 기본 동작
- 서버에서 헤더에 “chache-control: max-age = 시간” 을 실어서 보냄 ( → 클라이언트는 캐시 저장소(브라우저 캐시)에 저장)
- 다음 클라이언트 요청 때, 브라우저 캐시를 먼저 확인
-
검증 헤더와 조건부 요청
NOTE
검증 헤더
- Request: “If-Modified-Since”
- Response: “Last-Modified” + 응답코드 (304 Not Modified / 200 OK)
조건부 헤더
- Request: “If-None-Match”
- Response: “ETag” + 응답코드 (304 Not Modified / 200 OK)
- 검증헤더 추가
- 검증헤더를 추가하는 이유 → 만료된 캐시의 재사용을 위해서 ( 데이터가 동일하다면 굳이 다시 데이터를 보내어 갱신할 필요는 없으므로)
- 서버에서는 헤더에 “Last-Modified:” 추가 (최종 수정일 기입)
- 클라이언트가 요청할때에는 “if-modified-since:” 캐시에 있는 데이터 최종수정일을 해당 헤더에 붙여서 서버에 전달
- 서버는 최종 수정일이 같으면, 응답코드로 304(Not Modified) 를 응답 ( 그리고 http body 없이 응답 반환)
- 클라이언트는 캐시 데이터를 갱신 (max-age)
- Last-Modified 단점)
- 데이터를 수정했다가 다시 원복했는데, 최종 수정날짜가 달라져서 갱신할경우
- → Entity Tag (Etag) 사용
- 조건부 요청
- ETag + If-None-Match
-
-
캐시와 조건부 헤더 정리
- 캐시 헤더
- cache-Control : max-age
- 캐시 유효시간, 초 단위
- cache-Control : no-cache
- 데이터는 캐시해도 되지만, 서버에 검증하고 사용
- cache-Control : no-store
- 데이터에 민감한 정보가 있으므로 저장하면 안됨
- Pragma
- 잘 사용하지 않음
- Expires
- 캐시 만료일 지정
- cache-control : max-age가 주로 사용됨
- cache-Control : max-age
- 검증 헤더
- ETag , Last-Modified
- 조건부 요청 헤더
- If-Match, If-None-Match
- If-Modified-Since, If-Unmodified-Since
- 캐시 헤더
-
프록시
- CDN 서비스(= 프록시 캐시 서버)
- Cache-Control
- Cache-Control : public
- public 캐시에 저장
- Cache-Control : private
- 해당 사용자만을 위한 캐시
- Cache-Control : s-maxage
- 프록시 서버에서 준 캐시가 머물 수 있는 유효시간
- Age
- origin 서버에서 준 정보가 프록시 캐시서버에 머물 수 있는 시간
- Cache-Control : public
-
캐시 무효화
- 절대 캐시하지 않겠다 (아래 사항들을 포함해야함)
- cache-Control : no-cache, no-store, must-revalidate
- Pragma : no-cache
- no-cache : 원서버에 검증하고 사용
- Origin 서버 접근 불가시 → 프록시 서버에서 200 Ok를 보낼 수 있음
- no-store : 저장 x , 메모리에서만 사용
- must-revalidate : 캐시 만료후 최초 조회시 Origin 서버에 검증
- Origin 서버 접근 불가시 → 504 Error
- Pragma : HTTP 1.0 하위 호환
- 절대 캐시하지 않겠다 (아래 사항들을 포함해야함)
관련 문서
- [(학습/개발 (CS)/언어/JAVA/웹개발/HTTP) 인터넷 통신과정 ( + IP, TCP-UDP, PORT, DNS )](../../개발 (CS)/언어/JAVA/웹개발/HTTP/인터넷%20통신과정%20(%20+%20IP,%20TCP-UDP,%20PORT,%20DNS%20).md) — 이 노트의 “인터넷 네트워크 정리” 절을 더 상세히 다루는 원본 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/HTTP) URI, URL, URN](../../개발 (CS)/언어/JAVA/웹개발/HTTP/URI,%20URL,%20URN.md) — 이 노트의 “웹 브라우저 흐름과 URI” 절을 더 상세히 다루는 원본 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/HTTP) HTTP 프로토콜 #1](../../개발 (CS)/언어/JAVA/웹개발/HTTP/HTTP%20프로토콜%20%231.md) — 이 노트의 HTTP 역할/Stateless/비연결성 절을 더 상세히 다루는 원본 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/HTTP) HTTP 프로토콜 #2 ( Method )](../../개발 (CS)/언어/JAVA/웹개발/HTTP/HTTP%20프로토콜%20%232%20(%20Method%20).md) — 이 노트의 HTTP 메서드/URI 설계 절을 더 상세히 다루는 원본 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/HTTP) HTTP 프로토콜#3 ( 상태코드 )](../../개발 (CS)/언어/JAVA/웹개발/HTTP/HTTP%20프로토콜%233%20(%20상태코드%20).md) — 이 노트의 HTTP 상태코드 절을 더 상세히 다루는 원본 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/HTTP) HTTP 헤더 #1](../../개발 (CS)/언어/JAVA/웹개발/HTTP/HTTP%20헤더%20%231.md) — 이 노트의 “HTTP 헤더1 (일반헤더)” 절을 더 상세히 다루는 원본 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/HTTP) HTTP 헤더 #2 ( Cache 와 조건부 헤더 )](../../개발 (CS)/언어/JAVA/웹개발/HTTP/HTTP%20헤더%20%232%20(%20Cache%20와%20조건부%20헤더%20%20).md) — 이 노트의 캐시/조건부 요청 절을 더 상세히 다루는 원본 노트